﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Data;
using Bussiness;

namespace hostal
{
    public partial class RegistrarReserva : Form
    {
        public string numeroHabitacion { get; set; }
        public string fechaRegistro;
        bool click = false;
        bool fechaIngresoIncorrecto, fechaSalidaIncorrecto = true;
        private DataTable dataTableTemporal = new DataTable();
        private manejadorReservas habitacionesDisponibles = new manejadorReservas();
        private manejadorFechas fechas = new manejadorFechas();
        public List<string> coleccionHabitacionesDisponibles { get; set; }
        public List<string> coleccionCapacidadHabitacionesDisponibles { get; set; }
        habitacionDataAccess habitaciones = new habitacionDataAccess();

        public RegistrarReserva()
        {
            InitializeComponent();

            //habitacionDataAccess habitaciones = new habitacionDataAccess();
            dataTableTemporal = habitaciones.buscartipoHabitaciones();
            dg.DataSource = dataTableTemporal;
            for (int i = 0; i < dg.RowCount; i++)
            {
                CBTipoHabitacion.Items.Add(dg.Rows[i].Cells["tipo"].Value);
            }
            CBTipoHabitacion.Text = CBTipoHabitacion.Items[0].ToString();

            fechaRegistro = fechas.crearFechaActual();
            DTFechaIngreso.Text = fechaRegistro;
            DTFechaSalida.Text = fechaRegistro;
            DGHabitacionesDisponibles.Columns.Add("numero", "numero habitacion");
            DGHabitacionesDisponibles.Columns.Add("tipo", "tipo");
            DGHabitacionesDisponibles.Columns.Add("capacidad", "capacidad");

            DGHabitacionesReservadas.Columns.Add("numeroHabitacion", "numero habitacion");
            DGHabitacionesReservadas.Columns.Add("tipo", "tipo");
            DGHabitacionesReservadas.Columns.Add("capacidad", "capacidad");

            llenarGridHabitacionesDisponibles(fechaRegistro,fechaRegistro);
        }

        private void llenarGridHabitacionesDisponibles(string fechaIngreso, string fechaSalida)
        {
            try
            {
                coleccionHabitacionesDisponibles = habitacionesDisponibles.obtenerHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);
                coleccionCapacidadHabitacionesDisponibles = habitacionesDisponibles.obtenerCapacidadHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);

                for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; )
                {
                    DGHabitacionesDisponibles.Rows.Remove(DGHabitacionesDisponibles.Rows[0]);
                }

                for (int i = 0; i < coleccionHabitacionesDisponibles.Count(); i++)
                {
                    bool agregar = false;
                    for (int j = 0; j < DGHabitacionesReservadas.Rows.Count; j++)
                    {
                        agregar = coleccionHabitacionesDisponibles[i] == (DGHabitacionesReservadas.Rows[j].Cells["numeroHabitacion"].Value.ToString());
                        if (agregar)
                            j = DGHabitacionesReservadas.Rows.Count;
                    }
                    if (!agregar)
                        DGHabitacionesDisponibles.Rows.Add(coleccionHabitacionesDisponibles[i], CBTipoHabitacion.Text, coleccionCapacidadHabitacionesDisponibles[i]);
                }

                for (int j = 0; j < DGHabitacionesReservadas.Rows.Count; j++)
                {
                    if (!coleccionHabitacionesDisponibles.Contains(DGHabitacionesReservadas.Rows[j].Cells["numeroHabitacion"].Value.ToString()) && DGHabitacionesReservadas.Rows[j].Cells["tipo"].Value.ToString()==CBTipoHabitacion.Text)
                        DGHabitacionesReservadas.Rows.Remove(DGHabitacionesReservadas.Rows[j]);
                }

            } 
            catch (Exception exp) { }
        }

        private void BAceptar_Click(object sender, EventArgs e)
        {
            if (fechaIngresoIncorrecto = DTFechaIngreso.Value < System.DateTime.Today.Date)
                EPFechaIngreso.SetError(DTFechaIngreso, "La fecha de ingreso no puede ser menor a la actual");
            else
                EPFechaIngreso.Clear();
            if (fechaSalidaIncorrecto = DTFechaIngreso.Value > DTFechaSalida.Value)
                EPFechaSalida.SetError(DTFechaSalida, "La fecha de salida no puede ser menor a la ingreso");
            else
                EPFechaSalida.Clear();
            if (!fechaSalidaIncorrecto && !fechaIngresoIncorrecto)
            {
                ReservasDataAccess cuentas = new ReservasDataAccess();
                try
                {
                    int fila;
                    fila = DGHabitacionesReservadas.CurrentRow.Index;
                    fila = DGCliente.CurrentRow.Index;
                    string numeroDocumento = DGCliente.Rows[fila].Cells["numeroDocumento"].Value.ToString();
                    for (int i = 0; i < DGHabitacionesReservadas.Rows.Count; i++)
                    {
                        numeroHabitacion = DGHabitacionesReservadas.Rows[i].Cells["numeroHabitacion"].Value.ToString();
                        if (!cuentas.existeReserva(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, fechaRegistro))
                            cuentas.registrarReserva(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistro);
                        else
                            cuentas.activarReserva(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistro, fechaRegistro);
                    }
                    MessageBox.Show("Exito Al Registrar");
                    this.Close();
                }
                catch (SystemException exeption)
                {
                    if (DGCliente.Rows.Count==0)
                        MessageBox.Show("Debe existir al menos una persona parta registrar");
                    else    
                        MessageBox.Show("No se Registro Con Exito");
                }
            }
        }

        private void BTBuscarCliente_Click(object sender, EventArgs e)
        {
            BuscarClienteReserva buscarClienteReserva = new BuscarClienteReserva("si");
            string numeroDocumento;
            if (buscarClienteReserva.ShowDialog() == DialogResult.OK)
            {
                numeroDocumento = buscarClienteReserva.numeroDocumento;
                ClienteDataAccess buscarCliente = new ClienteDataAccess();
                dataTableTemporal=buscarCliente.buscarDatos(numeroDocumento);
                DGCliente.DataSource = dataTableTemporal;
            }
        }

        private void BTAgregarHuesped_Click(object sender, EventArgs e)
        {
            Registrar_Reserva registrarClienteReserva = new Registrar_Reserva();
            registrarClienteReserva.ShowDialog();
        }

        private void BCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void TBBuscarHabitacionesDisponibles_Click(object sender, EventArgs e)
        {
            if (DTFechaIngreso.Value.Date <= DTFechaSalida.Value.Date && DTFechaIngreso.Value >= System.DateTime.Today.Date)
            {
                llenarGridHabitacionesDisponibles(DTFechaIngreso.Text, DTFechaSalida.Text);
                EPFechaIngreso.Clear();
            }
            else
                EPFechaIngreso.SetError(DTFechaIngreso, "la fecha de ingreso no puede ser menor a la actual o a la fecha de salida");
        }

        private void BTAgregarHabitacion_Click(object sender, EventArgs e)
        {
            try
            {
                DGHabitacionesReservadas.Rows.Add(DGHabitacionesDisponibles.CurrentRow.Cells["numero"].Value.ToString(), DGHabitacionesDisponibles.CurrentRow.Cells["tipo"].Value.ToString(), DGHabitacionesDisponibles.CurrentRow.Cells["capacidad"].Value.ToString());
                DGHabitacionesDisponibles.Rows.Remove(DGHabitacionesDisponibles.CurrentRow);
            }
            catch (Exception exp) { }
        }

        private void BTQuitarHabitacion_Click(object sender, EventArgs e)
        {
            try
            {
                if (habitacionesDisponibles.estaHabitacionDisponible(DGHabitacionesReservadas.CurrentRow.Cells["numeroHabitacion"].Value.ToString()))
                {
                    DGHabitacionesDisponibles.Rows.Add(DGHabitacionesReservadas.CurrentRow.Cells["numeroHabitacion"].Value.ToString(), DGHabitacionesReservadas.CurrentRow.Cells["tipo"].Value.ToString(), DGHabitacionesReservadas.CurrentRow.Cells["capacidad"].Value.ToString());
                }
                DGHabitacionesReservadas.Rows.Remove(DGHabitacionesReservadas.CurrentRow);
                TBBuscarHabitacionesDisponibles_Click(sender, e);
            }
            catch(Exception exp){}
        }

        private void DTFechaIngreso_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaSalida_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void CBTipoHabitacion_SelectionChangeCommitted(object sender, EventArgs e)
        {
            click = true;
        }

        private void CBTipoHabitacion_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }

        private void CBTipoHabitacion_SelectedValueChanged(object sender, EventArgs e)
        {
            if (click)
                TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaIngreso_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaSalida_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

    }
}
